package com.zhangxu.microservice.auth.biz.util;

import com.zhangxu.microservice.auth.biz.config.AuthJwtProperties;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.util.Date;

@Slf4j
@Component
@RequiredArgsConstructor
public class JwtUtil {

    private final AuthJwtProperties jwtProperties;

    /**
     * 获取 JWT 加密使用的 Key。
     * Key 长度需满足 HS256 要求（≥256 bit，即 32 字节）。
     *
     * @return Key 对象，用于签发和解析 Token。
     */
    private Key getKey() {
        return Keys.hmacShaKeyFor(jwtProperties.getSecret().getBytes(StandardCharsets.UTF_8));
    }

    /**
     * 生成 JWT Token。
     * 在 Token 中添加 userId、username 两个 Claim，并设置签发时间和过期时间。
     *
     * @param userId   用户 ID
     * @param username 用户名
     * @return 生成的 JWT Token 字符串
     */
    public String generateToken(Long userId, String username) {
        return Jwts.builder()
                .claim("userId", userId)
                .claim("username", username)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + jwtProperties.getExpiration()))
                .signWith(getKey(), SignatureAlgorithm.HS256)
                .compact();
    }

    /**
     * 解析并验证 JWT Token，获取其中包含的 Claims。
     *
     * @param token JWT Token 字符串
     * @return Claims 对象，包含用户信息和 Token 元数据
     * @throws io.jsonwebtoken.JwtException 如果 Token 不合法或已过期
     */
    public Claims parseToken(String token) {
        return Jwts.parserBuilder().setSigningKey(getKey()).build().parseClaimsJws(token).getBody();
    }
}